/*
 $Id$

 Copyright (C) 2006-2007 by David Cotton

 This program is free software; you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation; either version 2 of the License, or (at your option) any later
 version.

 This program is distributed in the hope that it will be useful, but WITHOUT
 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

 You should have received a copy of the GNU General Public License along with
 this program; if not, write to the Free Software Foundation, Inc., 51 Franklin
 Street, Fifth Floor, Boston, MA 02110-1301, USA.
 */
package fr.free.jchecs.swg;

import static fr.free.jchecs.core.Piece.BLACK_KING;

import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Image;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;

import fr.free.jchecs.core.Game;
import fr.free.jchecs.core.Piece;
import fr.free.jchecs.core.move.Move;

/**
 * Composant affichant la liste des pièces capturées pour une couleur.
 * 
 * @author David Cotton
 */
final class CapturesPanel implements PropertyChangeListener
{
  /** Composant graphique externe. */
  private final JComponent _component;

  /** Partie liée au composant. */
  private final Game _game;

  /** Objet chargé du rendu des pièces. */
  private final PieceUI _pieceUI;

  /** Liste des labels affichant les icônes des pièces prises. */
  private final JLabel [] _labels;

  /** A vrai si le panel liste les pièces blanches prises. */
  private boolean _color;

  /**
   * Construit un nouveau composant d'affichage de la liste des pièces prises.
   * 
   * @param pPartie Définition de partie liée au composant.
   * @param pRendu Objet chargé du rendu des pièces.
   * @param pTrait A vrai si l'on veut la liste des pièces blanches prises.
   */
  CapturesPanel(final Game pPartie, final PieceUI pRendu, final boolean pTrait)
  {
    assert pPartie != null;
    assert pRendu != null;

    _game = pPartie;
    _pieceUI = pRendu;
    _color = pTrait;

    _labels = new JLabel [ 16 ];
    final JPanel fond = new JPanel(new GridLayout(1, _labels.length))
    {
      /** Identifiant de la classe pour la sérialisation. */
      private static final long serialVersionUID = 6954553000735433951L;

      /**
       * Surcharge pour adapter la taille minimale du composant en fonction de la taille des pièces.
       * 
       * @return Taille préférée du composant.
       */
      @Override
      public Dimension getPreferredSize()
      {
        final Image img = pRendu.getSmallImage(BLACK_KING);
        return new Dimension(img.getWidth(null), img.getHeight(null));
      }
    };
    for (int i = 0; i < _labels.length; i++)
    {
      _labels[i] = new JLabel();
      fond.add(_labels[i]);
    }
    fond.setBorder(BorderFactory.createLoweredBevelBorder());

    _component = fond;

    initCapturesPaint();

    pPartie.addPropertyChangeListener("position", this);
  }

  /**
   * Renvoi le composant graphique affichable.
   * 
   * @return Composant graphique.
   */
  JComponent getComponent()
  {
    assert _component != null;
    return _component;
  }

  /**
   * Initialise l'affichage de la liste de pièces.
   */
  void initCapturesPaint()
  {
    int i = 0;
    for (final Move m : _game.getMovesToCurrent())
    {
      final Piece prise = m.getCaptured();
      if ((prise != null) && (prise.isWhite() == _color))
      {
        _labels[i].setIcon(new ImageIcon(_pieceUI.getSmallImage(prise)));
        _labels[i].setVisible(true);
        i++;
      }
    }
    while (i < _labels.length)
    {
      _labels[i].setVisible(false);
      i++;
    }
  }

  /**
   * Réagit au changement dans la définition de la partie.
   * 
   * @param pEvt Evènement signalant le changement.
   */
  public void propertyChange(final PropertyChangeEvent pEvt)
  {
    assert pEvt != null;

    initCapturesPaint();
  }

  /**
   * Indique si le panel doit afficher les pièces prises blanches.
   * 
   * @param pCouleur A vrai pour afficher les pièces blanches prises.
   */
  void setWhite(final boolean pCouleur)
  {
    _color = pCouleur;

    initCapturesPaint();
  }
}
